package com.dtt.learning.repository;

import com.dtt.learning.model.DemoModel;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * DemoModel 实体类的数据库操作DAO接口类
 * <p>
 * 要操作数据库（增删改查）必须定义新的接口，并且要继承JpaRepository
 * <p>
 * 使用方式，使用@Autowird注解注入该类即可，参考DemoModelService
 * <p>
 * <p>
 * !!数据库的信息需要在application配置文件中设置!!
 * <pre>
 *     extends JpaRepository<T, ID>
 *     （1）T 指要操作的实体对象
 *     （2）ID 指（1）对应的实体对象的ID字段的类型，如String或者Integer
 *
 *     接口必须按照接口规范声明，接口声明参考https://docs.spring.io/spring-data/jpa/docs/current/reference/html/
 *
 *
 * Keyword	Sample	                    JPQL snippet
 *
 * And        findByLastnameAndFirstname  … where x.lastname = ?1 and x.firstname = ?2
 *
 * Or         findByLastnameOrFirstname   … where x.lastname = ?1 or x.firstname = ?2
 *
 * Is,Equals  findByFirstname,findByFirstnameIs,findByFirstnameEquals     … where x.firstname = ?1
 *
 * Between    findByStartDateBetween  … where x.startDate between ?1 and ?2
 *
 * LessThan   findByAgeLessThan       … where x.age < ?1
 *
 * LessThanEqual  findByAgeLessThanEqual  … where x.age <= ?1
 *
 * GreaterThan    findByAgeGreaterThan    … where x.age > ?1
 *
 * GreaterThanEqual   findByAgeGreaterThanEqual   … where x.age >= ?1
 *
 * After      findByStartDateAfter    … where x.startDate > ?1
 *
 * Before     findByStartDateBefore   … where x.startDate < ?1
 *
 * IsNull     findByAgeIsNull         … where x.age is null
 *
 * IsNotNull,NotNull  findByAge(Is)NotNull    … where x.age not null
 *
 * Like       findByFirstnameLike     … where x.firstname like ?1
 *
 * NotLike    findByFirstnameNotLike  … where x.firstname not like ?1
 *
 * StartingWith   findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
 *
 * EndingWith     findByFirstnameEndingWith   … where x.firstname like ?1 (parameter bound with prepended %)
 *
 * Containing     findByFirstnameContaining   … where x.firstname like ?1 (parameter bound wrapped in %)
 *
 * OrderBy        findByAgeOrderByLastnameDesc    … where x.age = ?1 order by x.lastname desc
 *
 * Not    findByLastnameNot                   … where x.lastname <> ?1
 *
 * In     findByAgeIn(Collection<Age> ages)   … where x.age in ?1
 *
 * NotIn  findByAgeNotIn(Collection<Age> ages)    … where x.age not in ?1
 *
 * True   findByActiveTrue()                  … where x.active = true
 *
 * False  findByActiveFalse()                 … where x.active = false
 *
 * IgnoreCase     findByFirstnameIgnoreCase   … where UPPER(x.firstame) = UPPER(?1)
 * </pre>
 */
public interface DemoModelRepository extends JpaRepository<DemoModel, String> {

    /**
     * 声明了一个通过demoName字段查询一个DemoModel的接口
     *
     * @param name demoName参数
     * @return DemoModel
     */
    DemoModel findByDemoName(String name);
}
